#include "link.h"

int empty(Pliink p)
{
	if(p==NULL || p->len<1)
		return 1;
	return 0;
}
//申请空间
Pliink creat_double()
{
	Pliink p=malloc(sizeof(liink));
	if(p==NULL)
	{
		printf("申请失败\n");
		return NULL;
	}
	p->len=0;
	p->pro=NULL;
	p->next=NULL;
	return p;
}
//头插法
int front_insert(Pliink p,int e)
{
	if(p==NULL || p->len<0)
	{
		printf("头插失败\n");
		return -1;
	}
	Pliink t=malloc(sizeof(liink));
	t->date=e;
	if(p->next==NULL)
	{
		p->next=t;
		t->pro=p;
		t->next=NULL;
	}
	else
	{
		t->next=p->next;
		t->pro=p;
		p->next->pro=t;
		p->next=t;
	}
	p->len++;
	return 0;
}
//尾插法
int rear_insert(Pliink p,int e)
{
	if(p==NULL || p->len<0)
	{
		printf("链表异常，尾插失败\n");
		return -1;
	}
	Pliink t=p;
	for(int i=0;i<p->len;i++)
	{
		t=t->next;
	}
	Pliink m=malloc(sizeof(liink));
	m->date=e;
	m->next=NULL;
	m->pro=t;
	t->next=m;
	p->len++;
	return 0;
}
//任意位置插入
int anypos_insert(Pliink p,int n,int e)
{
	if(empty(p)||n>p->len+1||n<1)
	{
		printf("任意位置插入失败\n");
		return -1;
	}
	Pliink t=p;
	for(int i=0;i<n-1;i++)
		t=t->next;
	Pliink m=malloc(sizeof(liink));
	m->date=e;
	m->next=t->next;
	m->pro=t;
	t->next->pro=m;
	t->next=m;
	p->len++;
	printf("插入成功\n");
	return 0;
}
//任意位置删除
int anypos_delete(Pliink p,int n)
{
	if(empty(p) || n<1 || n>p->len)
	{
		printf("任意位置删除失败\n");
		return -1;
	}
	Pliink t=p;
	for(int i=0;i<n-1;i++)
		t=t->next;
	Pliink q=t->next;
	t->next=q->next;
	q->next->pro=t;
	free(q);
	q=NULL;
	p->len--;
	printf("任意位置删除成功\n");
	return 0;
}
//链表销毁
int link_destroy(Pliink p)
{
	if(empty(p))
	{
		printf("链表异常，销毁失败\n");
		return -1;
	}
	Pliink t=p;
	while(t!=NULL)
	{
		t=t->next;
		free(p);
		p=t;
	}
	printf("释放完成\n");
	return 0;
}

//遍历输出
int output_link(Pliink p)
{
	Pliink t=p;
	for(int i=0;i<p->len;i++)
	{
		t=t->next;
		printf("第%d个节点数据为：%d\n",i+1,t->date);
	}
	return 0;
}
